<

Flutter モジュールを iOS プロジェクトに統合する

Flutter UI コンポーネントは既存の iOS に段階的に追加できます 埋め込みフレームワークとしてのアプリケーション。 Flutterを埋め込む方法はいくつかあります 既存のアプリケーションで。

  1. CocoaPods 依存関係マネージャーとインストールされた Flutter SDK を使用します。この場合、flutter_moduleからコンパイルされています アプリがビルドされるたびにソースが作成されます。 (おすすめされた。)

  2. Flutter エンジンのフレームワーク、コンパイルされた Dart コード、 およびすべての Flutter プラグイン。ここでは、フレームワークを手動で埋め込みます。 Xcode で既存のアプリケーションのビルド設定を更新します。 これは、すべての開発者を必要としたくないチームにとって便利です。 Flutter SDK と Cocoapods をローカルにインストールします。

  3. コンパイルされた Dart コードのフレームワークを作成します。 およびすべての Flutter プラグイン。 Flutter エンジンには CocoaPods を使用します。このオプションを使用すると、アプリケーションのフレームワークが埋め込まれます Xcode のプラグインですが、 CocoaPods ポッドスペックとしての Flutter エンジン。 これは 2 番目のオプションと似ていますが、次のような特徴があります。 大規模な Flutter.xcframework を配布する代替手段です。

UIKit で構築されたアプリを使用する例としては、 iOS ディレクトリを参照してください。add_to_app コードサンプル。 SwiftUI を使用した例については、次の iOS ディレクトリを参照してください。ニュースフィードアプリ。

システム要求

開発環境は次の条件を満たす必要があります。Flutter の macOS システム要件Xcodeがインストールされている。 Flutter は iOS 11 以降をサポートします。 さらに、次のものが必要になります。ココアポッドバージョン1.10以降。

Flutterモジュールを作成する

Flutter を既存のアプリケーションに埋め込むには、 上記のいずれかの方法を使用して、 まずFlutterモジュールを作成します。

コマンドラインから次を実行します。

cd some/path/
flutter create --template module my_flutter

Flutter モジュール プロジェクトは次の場所に作成されます。some/path/my_flutter/。 上記の最初の方法を使用している場合は、 モジュールは同じ親ディレクトリに作成する必要があります 既存の iOS アプリとして。

Flutter モジュール ディレクトリから、同じものを実行できます。flutter他の Flutter プロジェクトで使用するコマンド、 好きflutter run --debugまたflutter build ios。 モジュールを次の場所で実行することもできますAndroid Studio/IntelliJまたVSコードと Flutter プラグインと Dart プラグイン。このプロジェクトには、 モジュールのシングルビュー サンプル バージョンを作成する前に、 既存のアプリケーションに埋め込まれ、 これは段階的に役立つものです コードの Flutter のみの部分をテストします。

モジュール構成

my_flutterモジュールのディレクトリ構造は次のようになります。 通常の Flutter アプリケーション:

my_flutter/
├── .ios/
│   ├── Runner.xcworkspace
│   └── Flutter/podhelper.rb
├── lib/
│   └── main.dart
├── test/
└── pubspec.yaml

Dart コードをlib/ディレクトリ。

Flutter の依存関係を追加するmy_flutter/pubspec.yaml、 Flutter パッケージとプラグインが含まれます。

.ios/隠しサブフォルダーには Xcode ワークスペースが含まれています。 モジュールのスタンドアロン バージョンを実行できます。 これは、Flutter コードをブートストラップするためのラッパー プロジェクトです。 フレームワークの構築を容易にするヘルパー スクリプトが含まれています。 CocoaPods を使用してモジュールを既存のアプリケーションに埋め込みます。

Flutter モジュールを既存のアプリケーションに埋め込む

Flutter モジュールを開発したら、 ページの上部で説明されている方法を使用して埋め込むことができます。

flutterの使用アプリのサイズが大きくなる

オプション A - CocoaPods と Flutter SDK を使用して埋め込む

この方法では、開発者全員が作業を行う必要があります。 プロジェクトに Flutter SDK のバージョンをローカルにインストールする必要があります。 Flutter モジュールは、アプリがビルドされるたびにソースからコンパイルされます。 Xcode でアプリケーションをビルドするだけで、自動的に スクリプトを実行して、Dart とプラグインのコードを埋め込みます。 これにより、最新の状態での迅速な反復が可能になります。 追加の実行を行わずに Flutter モジュールのバージョンを変更する Xcode の外部のコマンド。

次の例では、既存の アプリケーションと Flutter モジュールは兄弟関係にあります ディレクトリ。ディレクトリ構造が異なる場合は、 相対パスの調整が必要になる場合があります。

some/path/
├── my_flutter/
│   └── .ios/
│       └── Flutter/
│         └── podhelper.rb
└── MyApp/
    └── Podfile

既存のアプリケーション (MyApp)はありません すでに Podfile がある場合は、実行しますpod initの中に
MyAppディレクトリを作成します。 使用方法の詳細を確認できます CocoaPods のCocoaPods スタートガイド。

  1. 次の行をPodfile:

    マイアプリ/ポッドファイル
    flutter_application_path = '../my_flutter'
    load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')
  2. それぞれについてポッドファイルのターゲットそれは必要です Flutterを埋め込み、呼び出しますinstall_all_flutter_pods(flutter_application_path)

    マイアプリ/ポッドファイル
    target 'MyApp' do
      install_all_flutter_pods(flutter_application_path)
    end
  3. の中にPodfilepost_installブロックする、電話するflutter_post_install(installer)

    マイアプリ/ポッドファイル
    post_install do |installer|
      flutter_post_install(installer) if defined?(flutter_post_install)
    end
  4. 走るpod install

podhelper.rbスクリプトにはプラグインが埋め込まれます。Flutter.framework、 とApp.frameworkあなたのプロジェクトに。

アプリのデバッグおよびリリースのビルド構成の埋め込み デバッグまたはリリースFlutterのビルドモード、 それぞれ。 プロファイルのビルド構成を追加する プロファイル モードでテストするためにアプリに追加します。

開けるMyApp.xcworkspaceXcodeで。 これで、次を使用してプロジェクトをビルドできます⌘B

オプション B - Xcode にフレームワークを埋め込む

あるいは、必要なフレームワークを生成することもできます 手動で編集してアプリケーションに埋め込みます 既存の Xcode プロジェクト。あなたのメンバーがこれを行うかもしれません チームは Flutter SDK と CocoaPods をローカルにインストールできません。 または、CocoaPods を使用したくない場合 既存のアプリケーションの依存関係マネージャーとして。 走らなければなりませんflutter build ios-frameworkFlutter モジュールでコードを変更するたびに。

次の例では、 フレームワークへのsome/path/MyApp/Flutter/

flutter build ios-framework --output=some/path/MyApp/Flutter/
some/path/MyApp/
└── Flutter/
    ├── Debug/
    │   ├── Flutter.xcframework
    │   ├── App.xcframework
    │   ├── FlutterPluginRegistrant.xcframework (only if you have plugins with iOS platform code)
    │   └── example_plugin.xcframework (each plugin is a separate framework)
    ├── Profile/
    │   ├── Flutter.xcframework
    │   ├── App.xcframework
    │   ├── FlutterPluginRegistrant.xcframework
    │   └── example_plugin.xcframework
    └── Release/
        ├── Flutter.xcframework
        ├── App.xcframework
        ├── FlutterPluginRegistrant.xcframework
        └── example_plugin.xcframework

生成されたフレームワークを既存のフレームワークにリンクして埋め込みます。 Xcodeでのアプリケーション。方法は複数あります これ - プロジェクトに最適な方法を使用してください。

たとえば、フレームワークを次からドラッグできます。some/path/MyApp/Flutter/Release/ファインダー内 ターゲットの中に建てる [設定] > [ビルド フェーズ] > [バイナリとライブラリのリンク]

ターゲットのビルド設定に追加します$(PROJECT_DIR)/Flutter/Release/フレームワークの検索パス(FRAMEWORK_SEARCH_PATHS)。

Update Framework Search Paths in Xcode

フレームワークを埋め込む

生成された動的フレームワークを埋め込む必要があります 実行時にロードされるようにアプリに追加します。

フレームワークをリンクすると、フレームワークがフレームワーク、ライブラリ、および埋め込みコンテンツターゲットのセクション全般的設定。 動的フレームワークを埋め込むには 選択する埋め込みと署名

それらは以下に表示されますフレームワークを埋め込む内部構築フェーズ次のように:

Embed frameworks in Xcode

これで、次を使用して Xcode でプロジェクトをビルドできるようになります。⌘B

オプション C - Xcode にアプリケーションとプラグインのフレームワークを埋め込み、CocoaPods を使用して Flutter フレームワークを埋め込む

あるいは、大規模な Flutter.xcframework を配布する代わりに、 他の開発者、マシン、または継続的統合システムへ、 代わりに追加することで、Flutter を CocoaPods podspec として生成できます。 旗--cocoapods。これにより、Flutter.podspecエンジン Flutter.xcframework の代わりに。 App.xcframework とプラグイン フレームワークが生成されます オプション B で説明されているとおりです。

を生成するには、Flutter.podspecおよびフレームワークを使用するには、次を実行します Flutter モジュールのルートにあるコマンド ラインから:

flutter build ios-framework --cocoapods --output=some/path/MyApp/Flutter/
some/path/MyApp/
└── Flutter/
    ├── Debug/
    │   ├── Flutter.podspec
    │   ├── App.xcframework
    │   ├── FlutterPluginRegistrant.xcframework
    │   └── example_plugin.xcframework (each plugin with iOS platform code is a separate framework)
    ├── Profile/
    │   ├── Flutter.podspec
    │   ├── App.xcframework
    │   ├── FlutterPluginRegistrant.xcframework
    │   └── example_plugin.xcframework
    └── Release/
        ├── Flutter.podspec
        ├── App.xcframework
        ├── FlutterPluginRegistrant.xcframework
        └── example_plugin.xcframework

CocoaPods を使用するホスト アプリは、Podfile に Flutter を追加できます。

マイアプリ/ポッドファイル
pod 'Flutter', :podspec => 'some/path/MyApp/Flutter/[build mode]/Flutter.podspec'

生成された App.xcframework をリンクして埋め込みます。 FlutterPluginRegistrant.xcframework、 および既存のアプリケーションへのプラグイン フレームワーク オプション B で説明されているとおりです。

ローカルネットワークのプライバシー権限

iOS 14 以降では、Dart マルチキャスト DNS を有効にします。 アプリのデバッグ バージョンのサービス たすホットリロードなどのデバッグ機能 開発ツール経由flutter attach

これを行う 1 つの方法は、アプリの Info.plist のコピーを個別に保持することです。 ビルド構成。次の手順では、 デフォルトデバッグリリース。 アプリのビルド構成に応じて、必要に応じて名前を調整します。

  1. アプリの名前を変更する情報plist情報-Debug.plist。 という名前のコピーを作成します情報リリース.plistそれを Xcode プロジェクトに追加します。

    Info-Debug.plist and Info-Release.plist in Xcode
  2. 情報-Debug.plist それだけキーを追加しますNSBonjourServicesそして、文字列を含む配列に値を設定します_dartVmService._tcp。 注 Xcode ではこれが「Bonjour サービス」として表示されます。

    必要に応じて、キーを追加しますNSLocalNetworkUsageDescriptionに設定します 必要に応じてカスタマイズされた権限ダイアログのテキスト。

    Info-Debug.plist with additional keys
  3. ターゲットのビルド設定で、Info.plist ファイル(INFOPLIST_FILE) からのパスを設定しますpath/to/Info.plistpath/to/Info-$(CONFIGURATION).plist

    Set INFOPLIST_FILE build setting

    これはパスに解決されます情報-Debug.plistデバッグ情報リリース.plistリリース

    Resolved INFOPLIST_FILE build setting

    あるいは、明示的に設定することもできます。デバッグへの道情報-Debug.plistそしてそのリリースへの道情報リリース.plist

  4. もし情報リリース.plistコピーはターゲットにありますビルド設定 > ビルドフェーズ > バンドルのコピーリソース構築フェーズ、削除します。

    Copy Bundle build phase

    デバッグ アプリによって読み込まれる最初の Flutter 画面で、プロンプトが表示されます。 ローカルネットワーク許可用。許可を有効にすることによっても許可できます。[設定] > [プライバシー] > [ローカル ネットワーク] > [アプリ]

    Local network permission dialog

アップルシリコン (arm64マック)

Apple Silicon (M1) Mac では、ホスト アプリはarm64シミュレータ。 Flutter がサポートしている間arm64シミュレーターでは、一部のプラグインはそうでない場合があります。使用する場合 これらのプラグインの 1 つでは、次のようなコンパイル エラーが表示される場合があります。未定義のシンボル 建築用 arm64そしてあなたは除外しなければなりませんarm64シミュレータから ホストアプリのアーキテクチャ。

ホスト アプリのターゲットで、除外されるアーキテクチャ(EXCLUDED_ARCHS) ビルド設定。 右矢印の開示インジケーター アイコンをクリックして、利用可能なビルド構成を展開します。 覆いかぶさるデバッグをクリックし、プラスアイコンをクリックします。変化任意の SDK任意の iOS シミュレーター SDK。 追加arm64ビルド設定値に。

Set conditional EXCLUDED_ARCHS build setting

正しく実行されると、Xcode は追加します。"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;あなたへプロジェクト.pbxprojファイル。

iOS 単体テストのターゲットに対して繰り返します。

発達

いまなら可能です flutter画面を追加する既存のアプリケーションに。